home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / cross / devpic.lha / devpic / source / picasm / picasm.h < prev    next >
C/C++ Source or Header  |  2000-02-27  |  8KB  |  399 lines

  1. /*
  2.  * picasm.h
  3.  *
  4.  * Copyright 1995-1998 Timo Rossi, <trossi@iki.fi>
  5.  * See the file picasm.doc for more information
  6.  * 
  7.  * http://www.iki.fi/trossi/pic/
  8.  * 
  9.  */
  10.  
  11. /*
  12.  * Version history:
  13.  *
  14.  * 1998-05-04   1.06   - fixed missing assembled code listing on lines
  15.  *                       with labels
  16.  *                     - added dollar-prefixed hex numbers
  17.  *                     - allows invalid tokens in code skipped with if..endif
  18.  *                     - shows macro line number in error messages
  19.  *                     - better error handling
  20.  *                     - reorganized device type/config handling
  21.  *                     - lots of new device types added
  22.  *                     - fixed ORG mode bug
  23.  *                     - allows TRIS PORTC
  24.  *                     - only warns about TRIS/OPTION with warnlevel 2
  25.  *                     - added ERROR directive
  26.  *                     - HEX_EOL #define
  27.  *
  28.  * 1996-09-08   1.05   added PIC16F84 (same as PIC16C84A)
  29.  * 1996-07-01          now defines __<pic_type> symbol
  30.  *                     symbol table listing option
  31.  * 1996-06-25   1.04   small changes, makefile for Watcom C
  32.  * 1996-06-06   1.03   many device table additions,
  33.  *                     better handling of CONFIG-directive
  34.  * 1996-05-17   1.02   local labels, device table additions
  35.  * 1996-03-26   1.0
  36.  * ...
  37.  */
  38.  
  39. #define VERSION "v1.06"
  40.  
  41. #if defined(__SASC) || defined(__TURBOC__) || defined(__WATCOMC__) || defined(_MSC_VER)
  42. #define strcasecmp stricmp
  43. #define strncasecmp strnicmp
  44. #endif
  45.  
  46. /* hex output end-of-line. if you need CRLFs in hex files
  47.  * when running on a system which does not normally generate
  48.  * them (such as Unix), change this to "\r\n"
  49.  */
  50. #define HEX_EOL "\n"
  51.  
  52. /* maximum number of errors before aborting assembly */
  53. #define MAX_ERRORS 20
  54.  
  55. /* output formats */
  56. enum {
  57.   IHX8M,
  58.   IHX16
  59. };
  60.  
  61. /* org mode */
  62. typedef enum {
  63.   O_NONE,
  64.   O_PROGRAM,
  65.   O_REGFILE,
  66.   O_EDATA
  67. } org_mode_t ;
  68.  
  69. typedef unsigned short pic_instr_t;
  70.  
  71. #define INVALID_INSTR  0xffff
  72. #define INVALID_DATA   0xffff
  73. #define INVALID_CONFIG 0xffff
  74. #define INVALID_ID     0xffff
  75.  
  76. /* list flags */
  77. #define LIST_LOC     1
  78. #define LIST_PROG    2
  79. #define LIST_EDATA   4
  80. #define LIST_FORWARD 8
  81. #define LIST_VAL     0x10
  82. #define LIST_PTR     0x20
  83.  
  84. /* inc_file types */
  85. typedef enum {
  86.   INC_FILE,
  87.   INC_MACRO
  88. } inctype_t;
  89.  
  90. /*
  91.  * structure for include files/macros
  92.  */
  93. struct inc_file {
  94.   struct inc_file *next;
  95.   union {
  96.     struct {
  97.       FILE *fp;
  98.       char *fname;
  99.     } f; /* file */
  100.     struct {
  101.       struct symbol *sym;
  102.       struct macro_line *ml;
  103.       struct macro_arg *args;
  104.       int uniq_id;
  105.     } m; /* macro */
  106.   } v;
  107.   inctype_t type;
  108.   int linenum;
  109.   int cond_nest_count;
  110. };
  111.  
  112. /*
  113.  * structure to hold one macro line
  114.  */
  115. struct macro_line {
  116.   struct macro_line *next;
  117.   char text[1];
  118. };
  119.  
  120. /* Macro argument */
  121. struct macro_arg {
  122.   struct macro_arg *next;
  123.   char text[1];
  124. };
  125.  
  126. /*
  127.  * structure for patching forward jumps
  128.  */
  129. typedef enum {
  130.   PATCH11, /* 14-bit instr. set PICs */
  131.   PATCH9,  /* 12-bit, goto */
  132.   PATCH8   /* 12-bit, call */
  133. } patchtype_t;
  134.  
  135. struct patch {
  136.   struct patch *next;
  137.   struct symbol *label;
  138.   int location;
  139.   patchtype_t type;
  140. };
  141.  
  142. #define PROGMEM_MAX 8192
  143. #define EEPROM_MAX 256
  144.  
  145. /*
  146.  * Definitions for different types of PIC processors
  147.  */
  148.  
  149. #define INSTRSET_MASK 0xF
  150. typedef enum {
  151.   PIC12BIT=1,
  152.   PIC14BIT
  153. } instrset_t;
  154.  
  155. typedef enum {
  156.   FUSE_16C5X=1,  /* most 12-bit PICs  */
  157.   FUSE_12C5XX,   /* 12-bit 8-pin PICs 12C508, 12C509 */
  158.   FUSE_12C6XX,   /* 14-bit 8-pin PICs 12C671, 12C672 */
  159.   FUSE_16CXX1,   /* 16C61, 16C71, 16C84 */
  160.   FUSE_16CXX2,   /* 16C62/64/65/73/74 */
  161.   FUSE_16C6XA,   /* 16C62A/63/64A/65A/66/67/72/73A/74A */
  162.   FUSE_16C55X,   /* 16C554/556/558 */
  163.   FUSE_16F8X,    /* 16C83/16F84 */
  164.   FUSE_16C71X,   /* 16C710/711 */
  165.   FUSE_16C715,   /* 16C715 */
  166.   FUSE_16C62X,   /* 16C620/621/622 */
  167.   FUSE_14000
  168. } fusetype_t;
  169.  
  170.  
  171. struct pic_type {
  172.   char *name;
  173.   int progmem_size;
  174.   short regfile_limit; /* without banking */
  175.   short eeprom_size;
  176.   int id_addr;
  177.   int fuse_addr;
  178.   fusetype_t fusetype;
  179.   instrset_t instr_set;
  180. };
  181.  
  182.  
  183. #define TOKSIZE 256
  184.  
  185. struct symbol {
  186.   struct symbol *next;
  187.   union {
  188.     long value;
  189.     struct macro_line *text;
  190.   } v;
  191.   char type;
  192.   char name[1];
  193. };
  194.  
  195. /* symbol types */
  196. enum {
  197.   SYM_MACRO,
  198.   SYM_FORWARD,
  199.   SYM_SET,
  200.   SYM_DEFINED
  201. };
  202.  
  203. #define SYMTAB_GLOBAL 0
  204. #define SYMTAB_LOCAL  1
  205.  
  206. /*
  207.  * token codes
  208.  */
  209. /**/
  210. enum {
  211.   TOK_INVALID,
  212.   TOK_EOF,
  213.   TOK_NEWLINE,
  214.   TOK_COLON,
  215.   TOK_PERIOD,
  216.   TOK_DOLLAR,
  217.   TOK_COMMA,
  218.   TOK_LEFTPAR,
  219.   TOK_RIGHTPAR,
  220.   TOK_LEFTBRAK,
  221.   TOK_RIGHTBRAK,
  222.   TOK_EQUAL,
  223.   TOK_EQ,
  224.   TOK_NOT_EQ,
  225.   TOK_LESS,
  226.   TOK_LESS_EQ,
  227.   TOK_GREATER,
  228.   TOK_GT_EQ,
  229.   TOK_PLUS,
  230.   TOK_MINUS,
  231.   TOK_ASTERISK,
  232.   TOK_SLASH,
  233.   TOK_PERCENT,
  234.   TOK_BITAND,
  235.   TOK_BITOR,
  236.   TOK_BITXOR,
  237.   TOK_BITNOT,
  238.   TOK_LSHIFT,
  239.   TOK_RSHIFT,
  240.   TOK_BACKSLASH,
  241.   TOK_IDENTIFIER,
  242.   TOK_LOCAL_ID,
  243.   TOK_INTCONST,
  244.   TOK_STRCONST, /* used as file name with include, and in EDATA */
  245.  
  246.   KW_INCLUDE,
  247.   KW_MACRO,
  248.   KW_ENDM,
  249.   KW_EXITM,
  250.   KW_IF,
  251.   KW_ELSE,
  252.   KW_ENDIF,
  253.   KW_EQU,
  254.   KW_SET,
  255.   KW_END,
  256.   KW_ORG,
  257.   KW_DS,
  258.   KW_EDATA,
  259.   KW_CONFIG,
  260.   KW_PICID,
  261.   KW_DEVICE,
  262.   KW_DEFINED,
  263.   KW_STREQ,
  264.   KW_ISSTR,
  265.   KW_CHRVAL,
  266.   KW_OPT,
  267.   KW_LOCAL,
  268.   KW_ENDLOCAL,
  269.   KW_ERROR,
  270.  
  271.   KW_ADDLW,
  272.   KW_ADDWF,
  273.   KW_ANDLW,
  274.   KW_ANDWF,
  275.   KW_BCF,
  276.   KW_BSF,
  277.   KW_BTFSC,
  278.   KW_BTFSS,
  279.   KW_CALL,
  280.   KW_CLRF,
  281.   KW_CLRW,
  282.   KW_CLRWDT,
  283.   KW_COMF,
  284.   KW_DECF,
  285.   KW_DECFSZ,
  286.   KW_GOTO,
  287.   KW_INCF,
  288.   KW_INCFSZ,
  289.   KW_IORLW,
  290.   KW_IORWF,
  291.   KW_MOVLW,
  292.   KW_MOVF,
  293.   KW_MOVWF,
  294.   KW_NOP,
  295.   KW_OPTION,
  296.   KW_RETFIE,
  297.   KW_RETLW,
  298.   KW_RETURN,
  299.   KW_RLF,
  300.   KW_RRF,
  301.   KW_SLEEP,  
  302.   KW_SUBLW,
  303.   KW_SUBWF,
  304.   KW_SWAPF,
  305.   KW_TRIS,
  306.   KW_XORLW,
  307.   KW_XORWF,
  308.  
  309.   KW_END_POS /* end marker */
  310. };
  311.  
  312. #define FIRST_KW KW_INCLUDE
  313. #define NUM_KEYWORDS (KW_END_POS-FIRST_KW)
  314.  
  315. /*
  316.  * truth values for boolean functions
  317.  */
  318. #define EXPR_FALSE (0)
  319. #define EXPR_TRUE (~0)
  320.  
  321. /* number of bits in an expression value */
  322. #define EXPR_NBITS 32
  323.  
  324. /*
  325.  * Success/failure return codes for functions
  326.  */
  327. #define OK   (0)
  328. #define FAIL (-1)
  329.  
  330. /*
  331.  * variable declarations
  332.  */
  333.  
  334. /* picasm.c */
  335. extern struct inc_file *current_file;
  336. extern char *line_buf_ptr;
  337. extern char line_buffer[256];
  338. extern int unique_id_count;
  339. extern int cond_nest_count;
  340. extern org_mode_t O_Mode;
  341. extern int prog_location, reg_location, edata_location, org_val;
  342. extern int warnlevel;
  343. extern struct patch **local_patch_list_ptr;
  344. extern int prog_mem_size;
  345. extern unsigned short list_flags;
  346. extern struct pic_type *pic_type;
  347. extern pic_instr_t config_fuses;
  348. extern int local_level;
  349.  
  350. /* token.c */
  351. extern int token_type, line_buf_off;
  352. extern char token_string[TOKSIZE];
  353. extern long token_int_val;
  354. extern int tok_char;
  355. extern int ifskip_mode;
  356.  
  357. /* expr.c */
  358. extern int expr_error;
  359.  
  360. /*
  361.  * function prototypes
  362.  */
  363.  
  364. /* picasm.c */
  365. void *mem_alloc(int size);
  366. #define mem_free(p) free(p)
  367. void fatal_error(char *, ...), error(int, char *, ...), warning(char *, ...);
  368. void write_listing_line(int cond_flag);
  369. void gen_code(int val);
  370. void add_patch(int tab, struct symbol *sym, patchtype_t type);
  371. int gen_byte_c(int instr_code);
  372.  
  373. /* config.c */
  374. void parse_config(void);
  375.  
  376. /* token.c */
  377. void get_token(void), skip_eol(void);
  378. void expand_macro(struct symbol *sym);
  379. void begin_include(char *fname), end_include(void);
  380. void read_src_char(void);
  381.  
  382. /* symtab.c */
  383. void init_symtab(void);
  384. void add_local_symtab(void);
  385. void remove_local_symtab(void);
  386. struct symbol *add_symbol(char *name, int tab);
  387. struct symbol *lookup_symbol(char *name, int tab);
  388. void dump_symtab(FILE *);
  389.  
  390. /* expr.c */
  391. long get_expression(void);
  392.  
  393. /* pic12bit.c */
  394. int assemble_12bit_mnemonic(int op);
  395.  
  396. /* pic14bit.c */
  397. int assemble_14bit_mnemonic(int op);
  398.  
  399.